在介紹 slot 之前,我們需要先了解元件的編譯作用域:
多數程式語言都會有變數作用範圍的概念,而我們就可以將編譯作用域想像成「元件的 scope」。例如當外層元件與內層元件的 data 都有相同名稱的屬性時:
const app = Vue.createApp({
data() {
return {
msg: 'Parent !'
}
}
});
app.component('custom-component', {
template: `<div>Hello!</div>`,
data () {
return {
msg: 'Child!'
}
}
});
由以上程式碼可以看到,內外元件都各自擁有 msg 這個 data 屬性,但內外層的 msg 實際上是兩種不同的屬性。
假如將模板內容更改一下:
<div id="app">
<h1>{{ msg }}</h1>
<custom-component>
{{ msg }}
</custom-component>
</div>
這樣就會讓外層的 <h1></h1>
會出現父層的 Parent !
而在子層內的 <custom-component>
內的 {{ msg }} 則會被 <custom-component>
原本所定義的 template 模板內容所取代:
<div id="app">
<h1>{{ msg }}</h1>
<custom-component>
{{ msg }}
</custom-component>
</div>
這是由於 Vue.js 在編譯元件的模板 (template) 時,會以元件模板的所定義內容為主。 也就是說,即使在 <custom-component>
內放入任何內容, Vue.js 在元件編譯成網頁模板的時候,會自動無視裡面的東西,並且以子元件的模板來替換掉。
slot 在官方文件的名稱叫做「插槽」,其作用是由外層元件將內容置放在至子層元件指定的位置中,來看看範例:
app.component('custom-component', {
template: `<div>
Hello!
<div>
<slot></slot>
</div>
</div>`,
data () {
return {
msg: 'Child !'
}
}
});
我們可以在 customComponent 加上一個 slot 標籤:
<custom-component>
{{ msg }}
</custom-component>
來看看網頁的表現:
原本應該定義在父層元件的 Parent,就會出現在子層元件的 slot 標籤位置,這是因為 slot 的特性是保留一個空間可以從外部傳入內容,但子元件本身不會有控制權。
那我們今天對於 Vue Slot 插槽的介紹就到這裡結束了
我們明天見囉!謝謝各位